package br.com.sisat.persistencia.DAO;

import java.io.Serializable;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import br.com.sisat.modelo.ConsultaDTO;
import br.com.sisat.modelo.PacienteDTO;
import br.com.sisat.modelo.PlanoDeSaudeDTO;
import br.com.sisat.persistencia.conexao.ConnectionProvider;
import br.com.sisat.util.ObjectUtil;
import br.com.sisat.util.UtilDatas;

public class MarcarConsultaDAO implements Serializable {

	private static final long serialVersionUID = 1L;

	private static MarcarConsultaDAO dao;
	
	public static MarcarConsultaDAO getInstance(){
		if(ObjectUtil.isEmpty(dao)){
			dao = new MarcarConsultaDAO();
		}
		return dao;
	}

	private static void preecherPK (ConsultaDTO consultaDTO, Connection conn)throws Exception{
		String sql = "select nextval ('sat.consulta_id_consulta')";
		PreparedStatement ps = conn.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		rs.next();
		consultaDTO.setIdConsulta(rs.getLong(1));
	}
	
	public String recuperarNomeTerapeuta(Long nuTerapeuta) throws Exception {
		String nome = "";
		String sql = " SELECT terapeuta.id_pessoa, pessoa.nome" +
					 " FROM sat.terapeuta terapeuta" +
					 " join sat.pessoa pessoa on (terapeuta.id_pessoa = pessoa.id_pessoa)" +
					 " where terapeuta.id_terapeuta = " + nuTerapeuta.toString();
		Connection conn = ConnectionProvider.getDefaultConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		while(rs.next()){
			nome = rs.getString("nome");
		}
		conn.close();
		return nome;
	}

	public String recuperarNomeEspecialiade(Long nuEspecialidade) throws Exception {
		String nome = "";
		String sql = " SELECT id_especialidade, nome " +
				     "FROM sat.especialidade" +
					 " where id_especialidade = " + nuEspecialidade.toString();
		Connection conn = ConnectionProvider.getDefaultConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		while(rs.next()){
			nome = rs.getString("nome");
		}
		conn.close();
		return nome;
	}

	public void salvar(ConsultaDTO consultaDTO) throws Exception {
		String sql = "INSERT INTO sat.consulta(id_consulta, id_terapeuta, id_pessoa, data, inicio, nu_plano_saude, nu_tipo_atendimento, nu_status) " +
					 "VALUES (?, ?, ?, ?, ?, ?, ?, ?);";
		Connection conn = ConnectionProvider.getDefaultConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		int index = 1;
		preecherPK(consultaDTO, conn);
		ps.setLong(index++, consultaDTO.getIdConsulta());
		ps.setLong(index++, consultaDTO.getIdTerapeuta());
		ps.setLong(index++, consultaDTO.getIdPessoa());
		ps.setDate(index++, UtilDatas.strToSQLDate(consultaDTO.getData()));
		ps.setString(index++, consultaDTO.getInicio());
		ps.setLong(index++, consultaDTO.getNuPlanoSaude());
		ps.setLong(index++, consultaDTO.getNuTipoAtendimento());
		ps.setLong(index++, consultaDTO.getNuStatus());
		ps.executeUpdate();
		conn.commit();
		
	}

	public List<PacienteDTO> recuperarPacientes(String string) throws Exception {
		List<PacienteDTO> pacientes = new ArrayList<PacienteDTO>();
		String sql = "SELECT pessoa.id_pessoa, pessoa.nome " +
					 "FROM sat.pessoa pessoa " +
					 "join sat.terapeuta terapeuta on (pessoa.id_pessoa != terapeuta.id_pessoa)";
						
		if(!ObjectUtil.isEmpty(string)){
			sql =  sql + " and paciente.no_pessoa = " + string;
		}
		Connection conn = ConnectionProvider.getDefaultConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		while(rs.next()){
			PacienteDTO pac = new PacienteDTO();
			pac.setIdPessoa		(rs.getLong("id_pessoa"));
			pac.setNoPaciente	(rs.getString("nome"));
			pacientes.add(pac);
		}
		return pacientes;
	}

	public void remarcarConsulta(ConsultaDTO consultaDTO) throws Exception {
		String sql = " UPDATE sat.consulta " +
					 " SET  id_pessoa=?, data=?, inicio=?" +
					 " WHERE id_consulta = " + consultaDTO.getIdConsulta().toString(); 
		Connection conn = ConnectionProvider.getDefaultConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		int index = 1;
		ps.setLong(index++, consultaDTO.getIdPessoa());
		ps.setDate(index++, UtilDatas.strToSQLDate(consultaDTO.getData()));
		ps.setString(index++, consultaDTO.getInicio());
		ps.executeUpdate();
		conn.commit();
		
	}

	public Long recuperarIdPessoa(ConsultaDTO consultaDTO) throws Exception {
		Long idPessoa = null;
		String sql = "SELECT id_pessoa " +
				     "FROM sat.pessoa " +
				     "where nome = '" + consultaDTO.getNoPaciente() + "'";
		Connection conn = ConnectionProvider.getDefaultConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		while(rs.next()){
			idPessoa = rs.getLong("id_pessoa");
		}
		conn.close();
		return idPessoa;
	}

	public List<PlanoDeSaudeDTO> consultarPlanosDeSaude() throws Exception{
		List<PlanoDeSaudeDTO>retorno = new ArrayList<PlanoDeSaudeDTO>();
		String sql = "SELECT nu_plano_saude, no_plano_saude FROM sat.plano_saude order by no_plano_saude";
		Connection conn = ConnectionProvider.getDefaultConnection();
		
		PreparedStatement ps = conn.prepareStatement(sql);
		ResultSet result = ps.executeQuery();
		while(result.next()){
			PlanoDeSaudeDTO plano = new PlanoDeSaudeDTO();
			plano.setNuPlanoSaude(result.getLong("nu_plano_saude"));
			plano.setNoPlanoSaude(result.getString("no_plano_saude"));
			retorno.add(plano);
		}
		
		conn.close();
		return retorno;
	}

}
